import numpy as np
import pandas as pd
from fractions import Fraction

# 这里定义一个单位矩阵，作为结果判断依据
temp = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
A = np.array([[-1, 3, 2],
              [5, 7, -2],
              [-3, 0, 1]])
B = np.array([[8, 2, -1],
              [6, 4, 0],
              [-2, 3, 5]])
# 两个矩阵的叉乘
AXB = np.cross(A, B)
print(AXB)
# 两个矩阵的点乘
AB = np.dot(A, B)
print(AB)
# np.linalg.inv求矩阵的逆矩阵
C = np.linalg.inv(AB)
# np.linalg.det求矩阵的行列式
CH = np.linalg.det(AB)
# print(np.array(C.dot(AB), dtype=int))

# 设置矩阵元素输出用分数表示
np.set_printoptions(formatter={'all': lambda x: str(Fraction(x).limit_denominator())})
# 这里如果不设置header=None默认就将数据第一行当作数据头
df = pd.read_csv("F:/成信大/多元统计分析/test1-2.csv", header=None)
# 转置矩阵
G = np.mat(df.T)
# 平均值
mean = df.mean()
# 标准差
std = df.std()
# 协方差
F = np.mat(df.cov())
# 相关系数
# E = np.mat(F/np.mat(std))
E = np.corrcoef(G)
# 特征值和特征向量
# a, b = np.linalg.eig(F)
# 矩阵E的迹
traceE = np.trace(E)
# 矩阵E的特征值a
a, b = np.linalg.eig(E)
# 矩阵E的特征值之和sumE
sumE = round(sum(a), 8)
# print(sumE == traceE)
'''
验证矩阵E的特征向量间的正交性
https://www.cnpython.com/qa/139953
'''
# print(b.dot(b.T))

'''
对矩阵D的做奇异值分解，输出左奇异矩阵、奇异值和右奇异矩阵，并查看左奇异矩阵和右奇异矩阵是否为正交矩阵。
https://jingyan.baidu.com/article/e75057f2385f34ebc81a8944.html
'''
# u - ;v - 奇异值;w -
u, v, w = np.linalg.svd(df)
print(u)
# 左奇异矩阵
# print(u)
# 奇异值
# print(v)
# 右奇异矩阵
# print(w)
# 将v转化为对角矩阵
v = np.diag(v)
# print(u)
# 查看左奇异矩阵和右奇异矩阵是否为正交矩阵。
u = u.dot(u.T)
w = w.dot(w.T)
print(u)
'''
将矩阵与单位矩阵比较np.allclose(w, np.eye(4))
np.eye()中的参数按照生成的矩阵的格式
https://www.cnpython.com/qa/164423
'''
print(np.allclose(u, np.eye(25)))
print(np.allclose(w, np.eye(4)))
